/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package practica2sudoku_alejandroaguirre;

/**
 *
 * @author Alejandro
 */
public class ModificacioTauler {

    /**
     * Mètodes globals
     */
    private int[][] tauler = new int[9][9];
    private int[] m = new int[9];

    /**
     * Mètode per inicialitzar el tauler
     */
    public void inicialitzarTauler() {

        for (int i = 0; i < tauler.length; i++) {
            for (int j = 0; j < tauler[i].length; j++) {
                tauler[i][j] = 0;
            }
        }
    }

    /**
     * Mètode per generar 9 nombres aleatoris diferents
     *
     * @return int[] nums
     */
    public int[] nombresAleatoris() {
        int[] nums = new int[9];
        int n, j, ocupacio = 0;

        do {
            n = (int) (9 * Math.random() + 1);

            if (ocupacio == 0) {
                nums[ocupacio] = n;
                ocupacio++;
                continue;
            }

            for (j = 0; j < ocupacio; j++) {
                if (n == nums[j]) {
                    break;
                } else {
                    continue;
                }
            }

            if (j == ocupacio) {
                nums[ocupacio] = n;
                ocupacio++;
            }

        } while (ocupacio < nums.length);
        return nums;
    }

    /**
     * Mètode per introduir nombres aleatoris al tauler
     *
     * @return int[][] tauler
     */
    public int[][] emplenarTauler() {
        int[] nums;
        int ocupacio = 0;
        int p = 0, q = 0;

        for (int r = 0; r < 9; r++) {
            nums = nombresAleatoris();
            for (int i = p; i < p + 3; i++) {
                for (int j = 0; j < 3; j++) {
                    tauler[i][j + q] = nums[ocupacio];
                    ocupacio++;
                }
            }
            q += 3;
            if (r % 3 == 2) {
                p += 3;
                q = 0;
            }
            ocupacio = 0;
        }
        return tauler;
    }

    /**
     * Mètode per comprovar que el tauler no té errors
     *
     * @return int[] m
     */
    public int[] comprovarJugada() {

        //Comprovem si hi ha errors a les files
        m = comprovarFiles();
        for (int k = 0; k < m.length; k++) {
            if (m[k] > 1) {
                return m;
            }
        }
        //Comprovem si hi ha errors a les columnes
        m = comprovarColumnes();
        for (int k = 0; k < m.length; k++) {
            if (m[k] > 1) {
                return m;
            }
        }
        return m;
    }

    /**
     * Mètode per comprovar les files del tauler
     *
     * @return int[] m
     */
    public int[] comprovarFiles() {
        int ocupacio, num;

        for (int i = 0; i < tauler.length; i++) {
            m = new int[9];
            ocupacio = 0;
            do {
                for (int j = 0; j < tauler[i].length; j++) {
                    num = tauler[i][j];
                    if (num == 1) {
                        m[0] += 1;
                        ocupacio++;
                    } else if (num == 2) {
                        m[1] += 1;
                        ocupacio++;
                    } else if (num == 3) {
                        m[2] += 1;
                        ocupacio++;
                    } else if (num == 4) {
                        m[3] += 1;
                        ocupacio++;
                    } else if (num == 5) {
                        m[4] += 1;
                        ocupacio++;
                    } else if (num == 6) {
                        m[5] += 1;
                        ocupacio++;
                    } else if (num == 7) {
                        m[6] += 1;
                        ocupacio++;
                    } else if (num == 8) {
                        m[7] += 1;
                        ocupacio++;
                    } else if (num == 9) {
                        m[8] += 1;
                        ocupacio++;
                    }
                }
            } while (ocupacio < 9);
            for (int k = 0; k < m.length; k++) {
                if ((m[k] < 1) || (m[k] > 1)) {
                    return m;
                }
            }
        }
        m = new int[9];
        return m;
    }

    /**
     * Mètode per comprovar columnes del tauler
     *
     * @return int[] m
     */
    public int[] comprovarColumnes() {
        int ocupacio, num;

        for (int i = 0; i < tauler.length; i++) {
            m = new int[9];
            ocupacio = 0;
            do {
                for (int j = 0; j < tauler[i].length; j++) {
                    num = tauler[j][i];
                    if (num == 1) {
                        m[0] += 1;
                        ocupacio++;
                    } else if (num == 2) {
                        m[1] += 1;
                        ocupacio++;
                    } else if (num == 3) {
                        m[2] += 1;
                        ocupacio++;
                    } else if (num == 4) {
                        m[3] += 1;
                        ocupacio++;
                    } else if (num == 5) {
                        m[4] += 1;
                        ocupacio++;
                    } else if (num == 6) {
                        m[5] += 1;
                        ocupacio++;
                    } else if (num == 7) {
                        m[6] += 1;
                        ocupacio++;
                    } else if (num == 8) {
                        m[7] += 1;
                        ocupacio++;
                    } else if (num == 9) {
                        m[8] += 1;
                        ocupacio++;
                    }
                }
            } while (ocupacio < 9);
            for (int k = 0; k < m.length; k++) {
                if ((m[k] < 1) || (m[k] > 1)) {
                    return m;
                }
            }
        }
        m = new int[9];
        return m;
    }
}
